<?php


namespace app\service\utils;


use app\service\utils\RedisService;
use Firebase\JWT\JWT;

class TokenService
{
    protected $key;

    public function __construct()
    {
        $this->key = config('zzcms.jwt_key');
    }

    /**
     * 生成token
     * @param $data
     * @return string
     */
    function generateToken($data)
    {
        $currentTime = time();
        $token = array(
            "iss" => $this->key,        //签发者 可以为空
            "aud" => '',          //面象的用户，可以为空
            "iat" => $currentTime,      //签发时间
            "nbf" => $currentTime,    //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
            "exp" => time() + 86400, //token 过期时间
            "data" => $data, //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
        );
        $jwt = JWT::encode($token, $this->key, "HS256");  //根据参数生成了 token
        return $jwt;
    }

    /**
     * 校验token
     * @param $token
     * @return object|null
     * @throws \Exception
     */
    function checkToken($token)
    {
        try {
            JWT::$leeway = 60;  // 当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, $this->key, ['HS256']);  // HS256方式，这里要和签发的时候对应
            if (!isset($decoded->data)) {
                throw new \Exception('token错误', -1);
            }
            return $decoded;
        } catch (\Firebase\JWT\SignatureInvalidException $e) {
            throw new \Exception('签名不正确', -1);
        } catch (\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
            throw new \Exception($e->getMessage(), -1);
        } catch (\Firebase\JWT\ExpiredException $e) {  // token过期
            throw new \Exception('token过期', -1);
        } catch (\Exception $e) {  // 其他错误
            throw new \Exception($e->getMessage(), -1);
        }
    }
}